# -*- coding: utf-8 -*-
# @Time    : 2024/7/30 14:54
# @Author  : yujiahao
# @File    : 67_fastapi_jinja2.py
# @description:模板


"""
FastAPI 支持多种模板引擎。

Flask 等工具使用的 Jinja2 是最常用的模板引擎。

在 Starlette 的支持下，FastAPI 应用可以直接使用工具轻易地配置 Jinja2。

安装依赖项：
安装 jinja2：

    pip install jinja2

使用 Jinja2Templates：

1. 导入 Jinja2Templates
2. 创建可复用的 templates 对象
3. 在返回模板的路径操作中声明 Request 参数
4. 使用 templates 渲染并返回 TemplateResponse，传递模板的名称、request对象以及一个包含多个键值对（用于Jinja2模板）的 "context" 字典
"""

# 导入FastAPI相关模块
from fastapi import FastAPI, Request  # FastAPI用于创建应用实例，Request用于获取请求信息
from fastapi.responses import HTMLResponse  # HTMLResponse用于返回HTML响应
from fastapi.staticfiles import StaticFiles  # StaticFiles用于处理静态文件
from fastapi.templating import Jinja2Templates  # Jinja2Templates用于处理Jinja2模板

# 创建FastAPI应用实例
app = FastAPI()

# 挂载静态文件目录
# 将/static路径映射到static目录，用于存放静态文件（如CSS、JavaScript、图片等）
app.mount("/static", StaticFiles(directory="static"), name="static")

# 创建可复用的 templates 对象 设置Jinja2模板目录
# 指定模板文件的存放目录为templates
templates = Jinja2Templates(directory="templates")


# 定义一个GET请求的路由，路径参数为id，返回HTML响应
@app.get("/items/{id}", response_class=HTMLResponse)
async def read_item(request: Request, id: str):
    """
    处理/items/{id}路径的GET请求，渲染item.html模板并返回HTML响应。

    参数:
    - request: 请求对象，包含请求的详细信息。
    - id: 路径参数，表示要访问的项目ID。

    返回:
    - HTML响应，包含渲染后的item.html模板。
    """
    # 在返回模板的路径操作中声明 Request 参数
    # 使用 templates 渲染并返回 TemplateResponse， 传递模板的名称、request对象以及一个包含多个键值对（用于Jinja2模板）的"context"字典，
    # 使用Jinja2模板引擎渲染item.html模板，并传递上下文数据{id: id}
    return templates.TemplateResponse(
        request=request,  # 传递请求对象
        name="item.html",  # 指定要渲染的模板文件名
        context={"request": request, "id": id}  # 传递给模板的上下文数据，包括请求对象和id
    )
